/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package UI;

import ADO.Logs;
import Excepciones.CantidadNodosSuperada;
import Excepciones.NodoInexistente;
import XML.filtroExtensionXML;
import com.example.clientsocket.Servidor;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.ResourceBundle;
import javax.swing.JFileChooser;
import javax.swing.JFrame;

import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;


/**
 *
 * @author Marco
 */
public class VPrincipal extends javax.swing.JFrame implements Servidor.OnComunicarFrameListener {

    /**
     * Creates new form Principal
     */
    private static Servidor servidor;
    private String rutaArchivo;//este atributo guarda la ruta del archivo, ais si solo deseo guardar la paso, sin invocar al file chooser
    Lienzo lienzo = new Lienzo(this);
    final JFileChooser selecArchivo;
    
    

    public VPrincipal() {
        initComponents();
        servidor = new Servidor(this);
        File saves = new File("./Saves");
        if(!saves.exists()){
        saves.mkdir();
        }
        rutaArchivo = "./Saves/grafo1";// si lo guarda por primera vez sin especificar, nombre y ruta pro defecto
        setExtendedState(JFrame.MAXIMIZED_BOTH);//el panel empeiza maximizado
        selecArchivo = new JFileChooser();
        selecArchivo.setFileSelectionMode(JFileChooser.FILES_ONLY);
        consola.setBorder(javax.swing.BorderFactory.createRaisedBevelBorder());
        
        

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        consola = new javax.swing.JTextArea();
        panelFondoHoja = new javax.swing.JPanel();
        panelOpciones = new javax.swing.JPanel();
        btnWarshall = new javax.swing.JButton();
        txtWarshallEntrada = new javax.swing.JTextField();
        txtWarshallFinal = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jSeparator3 = new javax.swing.JSeparator();
        jSeparator4 = new javax.swing.JSeparator();
        jbtnCalcularAEM = new javax.swing.JButton();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jtxtNodoInicio = new javax.swing.JTextField();
        jbtnCalcularSPF = new javax.swing.JButton();
        jMenuBar1 = new javax.swing.JMenuBar();
        MArchivo = new javax.swing.JMenu();
        MINuevo = new javax.swing.JMenuItem();
        MIAbrir = new javax.swing.JMenuItem();
        MIGuardar = new javax.swing.JMenuItem();
        MIGuardarComo = new javax.swing.JMenuItem();
        MIGuardarImagen = new javax.swing.JMenuItem();
        jSeparator2 = new javax.swing.JPopupMenu.Separator();
        MIIniciarSecion = new javax.swing.JMenuItem();
        MICerrarSesion = new javax.swing.JMenuItem();
        MICrearUsuario = new javax.swing.JMenuItem();
        MILogs = new javax.swing.JMenuItem();
        MEdiar = new javax.swing.JMenu();
        MNodo = new javax.swing.JMenu();
        MINuevoNodo = new javax.swing.JMenuItem();
        MIPonderarNodo = new javax.swing.JMenuItem();
        MIEliminarNodo = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        MArco = new javax.swing.JMenu();
        MINuevoArco = new javax.swing.JMenuItem();
        MIEliminarArco = new javax.swing.JMenuItem();
        MIPonderarArco = new javax.swing.JMenuItem();
        MOpciones = new javax.swing.JMenu();
        MIIniciarServidor = new javax.swing.JMenuItem();
        MIlimpiarAcciones = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("UI/Bundle"); // NOI18N
        setTitle(bundle.getString("VPrincipal.title")); // NOI18N
        setBackground(new java.awt.Color(0, 0, 153));
        setPreferredSize(new java.awt.Dimension(1200, 713));
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
            public void windowClosed(java.awt.event.WindowEvent evt) {
                formWindowClosed(evt);
            }
        });

        consola.setEditable(false);
        consola.setBackground(new java.awt.Color(0, 0, 0));
        consola.setColumns(20);
        consola.setForeground(new java.awt.Color(0, 255, 0));
        consola.setRows(10);
        jScrollPane1.setViewportView(consola);

        panelFondoHoja.setBackground(new java.awt.Color(102, 102, 102));
        panelFondoHoja.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
        panelFondoHoja.setAutoscrolls(true);
        panelFondoHoja.setPreferredSize(new java.awt.Dimension(1000, 570));

        javax.swing.GroupLayout panelFondoHojaLayout = new javax.swing.GroupLayout(panelFondoHoja);
        panelFondoHoja.setLayout(panelFondoHojaLayout);
        panelFondoHojaLayout.setHorizontalGroup(
            panelFondoHojaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 996, Short.MAX_VALUE)
        );
        panelFondoHojaLayout.setVerticalGroup(
            panelFondoHojaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 566, Short.MAX_VALUE)
        );

        panelOpciones.setBackground(new java.awt.Color(204, 204, 204));
        panelOpciones.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
        panelOpciones.setPreferredSize(new java.awt.Dimension(180, 570));

        btnWarshall.setText(bundle.getString("VPrincipal.btnWarshall.text_1")); // NOI18N
        btnWarshall.setEnabled(false);
        btnWarshall.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnWarshallActionPerformed(evt);
            }
        });

        txtWarshallEntrada.setText(bundle.getString("VPrincipal.txtWarshallEntrada.text")); // NOI18N
        txtWarshallEntrada.setEnabled(false);

        txtWarshallFinal.setText(bundle.getString("VPrincipal.txtWarshallFinal.text")); // NOI18N
        txtWarshallFinal.setEnabled(false);

        jLabel1.setText(bundle.getString("VPrincipal.jLabel1.text")); // NOI18N

        jLabel2.setText(bundle.getString("VPrincipal.jLabel2.text")); // NOI18N

        jLabel3.setFont(new java.awt.Font("Felix Titling", 0, 14)); // NOI18N
        jLabel3.setText(bundle.getString("VPrincipal.jLabel3.text")); // NOI18N

        jbtnCalcularAEM.setText(bundle.getString("VPrincipal.jbtnCalcularAEM.text_1")); // NOI18N
        jbtnCalcularAEM.setEnabled(false);
        jbtnCalcularAEM.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnCalcularAEMActionPerformed(evt);
            }
        });

        jLabel4.setFont(new java.awt.Font("Felix Titling", 0, 11)); // NOI18N
        jLabel4.setText(bundle.getString("VPrincipal.jLabel4.text")); // NOI18N

        jLabel5.setFont(new java.awt.Font("Felix Titling", 0, 11)); // NOI18N
        jLabel5.setText(bundle.getString("VPrincipal.jLabel5.text")); // NOI18N

        jLabel6.setText(bundle.getString("VPrincipal.jLabel6.text")); // NOI18N

        jtxtNodoInicio.setText(bundle.getString("VPrincipal.jtxtNodoInicio.text")); // NOI18N
        jtxtNodoInicio.setEnabled(false);

        jbtnCalcularSPF.setText(bundle.getString("VPrincipal.jbtnCalcularSPF.text_1")); // NOI18N
        jbtnCalcularSPF.setEnabled(false);
        jbtnCalcularSPF.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbtnCalcularSPFActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelOpcionesLayout = new javax.swing.GroupLayout(panelOpciones);
        panelOpciones.setLayout(panelOpcionesLayout);
        panelOpcionesLayout.setHorizontalGroup(
            panelOpcionesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jSeparator3)
            .addComponent(jSeparator4)
            .addGroup(panelOpcionesLayout.createSequentialGroup()
                .addGroup(panelOpcionesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelOpcionesLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txtWarshallEntrada, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(10, 10, 10)
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txtWarshallFinal, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelOpcionesLayout.createSequentialGroup()
                        .addGap(65, 65, 65)
                        .addComponent(jLabel3))
                    .addGroup(panelOpcionesLayout.createSequentialGroup()
                        .addGap(57, 57, 57)
                        .addComponent(btnWarshall))
                    .addGroup(panelOpcionesLayout.createSequentialGroup()
                        .addGap(21, 21, 21)
                        .addComponent(jLabel4))
                    .addGroup(panelOpcionesLayout.createSequentialGroup()
                        .addGap(50, 50, 50)
                        .addComponent(jbtnCalcularAEM))
                    .addGroup(panelOpcionesLayout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(panelOpcionesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jLabel5)
                            .addGroup(panelOpcionesLayout.createSequentialGroup()
                                .addComponent(jLabel6)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jtxtNodoInicio, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE))))
                    .addGroup(panelOpcionesLayout.createSequentialGroup()
                        .addGap(53, 53, 53)
                        .addComponent(jbtnCalcularSPF)))
                .addContainerGap(25, Short.MAX_VALUE))
        );
        panelOpcionesLayout.setVerticalGroup(
            panelOpcionesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelOpcionesLayout.createSequentialGroup()
                .addGap(4, 4, 4)
                .addComponent(jLabel3)
                .addGap(18, 18, 18)
                .addGroup(panelOpcionesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(txtWarshallEntrada, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2)
                    .addComponent(txtWarshallFinal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(btnWarshall)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jSeparator3, javax.swing.GroupLayout.PREFERRED_SIZE, 7, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel4)
                .addGap(15, 15, 15)
                .addComponent(jbtnCalcularAEM)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jSeparator4, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabel5)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(panelOpcionesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel6)
                    .addComponent(jtxtNodoInicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jbtnCalcularSPF)
                .addContainerGap(304, Short.MAX_VALUE))
        );

        MArchivo.setText(bundle.getString("VPrincipal.MArchivo.text_1")); // NOI18N
        MArchivo.setName(""); // NOI18N

        MINuevo.setText(bundle.getString("VPrincipal.MINuevo.text")); // NOI18N
        MINuevo.setEnabled(false);
        MINuevo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MINuevoActionPerformed(evt);
            }
        });
        MArchivo.add(MINuevo);

        MIAbrir.setText(bundle.getString("VPrincipal.MIAbrir.text")); // NOI18N
        MIAbrir.setEnabled(false);
        MIAbrir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MIAbrirActionPerformed(evt);
            }
        });
        MArchivo.add(MIAbrir);

        MIGuardar.setText(bundle.getString("VPrincipal.MIGuardar.text")); // NOI18N
        MIGuardar.setEnabled(false);
        MIGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MIGuardarActionPerformed(evt);
            }
        });
        MArchivo.add(MIGuardar);

        MIGuardarComo.setText(bundle.getString("VPrincipal.MIGuardarComo.text")); // NOI18N
        MIGuardarComo.setEnabled(false);
        MIGuardarComo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MIGuardarComoActionPerformed(evt);
            }
        });
        MArchivo.add(MIGuardarComo);

        MIGuardarImagen.setText(bundle.getString("VPrincipal.MIGuardarImagen.text")); // NOI18N
        MIGuardarImagen.setEnabled(false);
        MIGuardarImagen.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MIGuardarImagenActionPerformed(evt);
            }
        });
        MArchivo.add(MIGuardarImagen);
        MArchivo.add(jSeparator2);

        MIIniciarSecion.setText(bundle.getString("VPrincipal.MIIniciarSecion.text")); // NOI18N
        MIIniciarSecion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MIIniciarSecionActionPerformed(evt);
            }
        });
        MArchivo.add(MIIniciarSecion);

        MICerrarSesion.setText(bundle.getString("VPrincipal.MICerrarSesion.text")); // NOI18N
        MICerrarSesion.setEnabled(false);
        MICerrarSesion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MICerrarSesionActionPerformed(evt);
            }
        });
        MArchivo.add(MICerrarSesion);

        MICrearUsuario.setText(bundle.getString("VPrincipal.MICrearUsuario.text")); // NOI18N
        MICrearUsuario.setEnabled(false);
        MICrearUsuario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MICrearUsuarioActionPerformed(evt);
            }
        });
        MArchivo.add(MICrearUsuario);

        MILogs.setText(bundle.getString("VPrincipal.MILogs.text")); // NOI18N
        MILogs.setEnabled(false);
        MILogs.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MILogsActionPerformed(evt);
            }
        });
        MArchivo.add(MILogs);

        jMenuBar1.add(MArchivo);

        MEdiar.setText(bundle.getString("VPrincipal.MEdiar.text_1")); // NOI18N
        MEdiar.setEnabled(false);

        MNodo.setText(bundle.getString("VPrincipal.MNodo.text_1")); // NOI18N

        MINuevoNodo.setText(bundle.getString("VPrincipal.MINuevoNodo.text_1")); // NOI18N
        MINuevoNodo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MINuevoNodoActionPerformed(evt);
            }
        });
        MNodo.add(MINuevoNodo);

        MIPonderarNodo.setText(bundle.getString("VPrincipal.MIPonderarNodo.text_1")); // NOI18N
        MIPonderarNodo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MIPonderarNodoActionPerformed(evt);
            }
        });
        MNodo.add(MIPonderarNodo);

        MIEliminarNodo.setText(bundle.getString("VPrincipal.MIEliminarNodo.text_1")); // NOI18N
        MIEliminarNodo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MIEliminarNodoActionPerformed(evt);
            }
        });
        MNodo.add(MIEliminarNodo);

        MEdiar.add(MNodo);
        MEdiar.add(jSeparator1);

        MArco.setText(bundle.getString("VPrincipal.MArco.text_1")); // NOI18N

        MINuevoArco.setText(bundle.getString("VPrincipal.MINuevoArco.text_1")); // NOI18N
        MINuevoArco.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MINuevoArcoActionPerformed(evt);
            }
        });
        MArco.add(MINuevoArco);

        MIEliminarArco.setText(bundle.getString("VPrincipal.MIEliminarArco.text_1")); // NOI18N
        MIEliminarArco.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MIEliminarArcoActionPerformed(evt);
            }
        });
        MArco.add(MIEliminarArco);

        MIPonderarArco.setText(bundle.getString("VPrincipal.MIPonderarArco.text_1")); // NOI18N
        MIPonderarArco.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MIPonderarArcoActionPerformed(evt);
            }
        });
        MArco.add(MIPonderarArco);

        MEdiar.add(MArco);

        jMenuBar1.add(MEdiar);

        MOpciones.setText(bundle.getString("VPrincipal.MOpciones.text")); // NOI18N
        MOpciones.setEnabled(false);

        MIIniciarServidor.setText(bundle.getString("VPrincipal.MIIniciarServidor.text")); // NOI18N
        MIIniciarServidor.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MIIniciarServidorActionPerformed(evt);
            }
        });
        MOpciones.add(MIIniciarServidor);

        MIlimpiarAcciones.setText(bundle.getString("VPrincipal.MIlimpiarAcciones.text")); // NOI18N
        MIlimpiarAcciones.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                MIlimpiarAccionesActionPerformed(evt);
            }
        });
        MOpciones.add(MIlimpiarAcciones);

        jMenuBar1.add(MOpciones);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1)
            .addGroup(layout.createSequentialGroup()
                .addComponent(panelFondoHoja, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelOpciones, javax.swing.GroupLayout.DEFAULT_SIZE, 226, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(panelFondoHoja, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(panelOpciones, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 98, Short.MAX_VALUE)
                .addGap(6, 6, 6))
        );

        setBounds(0, 0, 1248, 752);
    }// </editor-fold>//GEN-END:initComponents

    

    private void MINuevoNodoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MINuevoNodoActionPerformed
        try {
            lienzo.agregarNodo(20, 20);
        } catch (CantidadNodosSuperada cant) {
            JOptionPane.showMessageDialog(null, cant.getMessage(), "ATENCION", JOptionPane.WARNING_MESSAGE);

        }
    }//GEN-LAST:event_MINuevoNodoActionPerformed

    private void MINuevoArcoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MINuevoArcoActionPerformed
        int ini = Integer.parseInt(JOptionPane.showInputDialog("Nodo inicial"));
        int fin = Integer.parseInt(JOptionPane.showInputDialog("Nodo final"));
        lienzo.agregarArco(ini, fin);
    }//GEN-LAST:event_MINuevoArcoActionPerformed

    private void MIEliminarArcoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MIEliminarArcoActionPerformed
        if (lienzo.getListaArcos().size() > 0) {
            /*  int ini = Integer.parseInt(JOptionPane.showInputDialog("Nodo inicual"));
             int fin = Integer.parseInt(JOptionPane.showInputDialog("Nodo final"));
             if(lienzo.existeArco(ini, fin))
             lienzo.eliminarArco(ini, fin);
             else
             JOptionPane.showMessageDialog(null, "No existe el arco "); 
             */
            String arcoABorrar = JOptionPane.showInputDialog("Ingrese el nombre del arco: ");
            if (lienzo.eliminarArco(arcoABorrar)) {
            } else {
                JOptionPane.showMessageDialog(null, "No hay nodos ingresados");
            }

        } else {
            JOptionPane.showMessageDialog(null, "No hay nodos ingresados");
        }
    }//GEN-LAST:event_MIEliminarArcoActionPerformed

    private void MIPonderarArcoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MIPonderarArcoActionPerformed
        /*        int ini = Integer.parseInt(JOptionPane.showInputDialog("Nodo inicual"));
         int fin = Integer.parseInt(JOptionPane.showInputDialog("Nodo final"));
         int peso = Integer.parseInt(JOptionPane.showInputDialog("Peso: "));
         lienzo.ponderarArco(ini, fin,peso);
         * */
        if (lienzo.getListaArcos().size() > 0) {
            int peso = -1;
            String arcoAPonderar = JOptionPane.showInputDialog("Ingrese el nombre del arco: ");
            try {
                peso = Integer.parseInt(JOptionPane.showInputDialog("Peso"));
                
            } catch (java.lang.NumberFormatException e) {
                JOptionPane.showMessageDialog(null, "El peso debe ser numerico");
            }
            if(peso <0){
                JOptionPane.showMessageDialog(null, "PGG solo soporta pesos postivios momentaneamente");
            }
            else{
                 if (lienzo.ponderarArco(arcoAPonderar, peso)) {
            } else {
                JOptionPane.showMessageDialog(null, "No existe el arco");
            }
            }
           
        } else {
            JOptionPane.showMessageDialog(null, "No hay nodos ingresados");
        }


    }//GEN-LAST:event_MIPonderarArcoActionPerformed

    private void MIPonderarNodoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MIPonderarNodoActionPerformed
        if (lienzo.getListaNodos().size() > 0) {//si la nista de nodos no esta vacia
            int in1 = Integer.parseInt(JOptionPane.showInputDialog("Nodo a ponderar"));
            int in2 = Integer.parseInt(JOptionPane.showInputDialog("Peso: "));
            if (lienzo.existeNodo(in1)) {//el nodo a borrar existe
                lienzo.ponderarNodo(in1, in2);
            } else {
                JOptionPane.showMessageDialog(null, "No existe el nodo: " + in1);
            }
        } else {
            JOptionPane.showMessageDialog(null, "No hay nodos ingresados");
        }
    }//GEN-LAST:event_MIPonderarNodoActionPerformed

    private void MIEliminarNodoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MIEliminarNodoActionPerformed
        if (lienzo.getListaNodos().size() > 0) {//si la nista de nodos no esta vacia
            int in1 = Integer.parseInt(JOptionPane.showInputDialog("Nodo a eliminar"));
            if (lienzo.existeNodo(in1)) {//el nodo a borrar existe
                lienzo.eliminarNodo(in1);
            } else {
                JOptionPane.showMessageDialog(null, "No existe el nodo: " + in1);
            }
        } else {
            JOptionPane.showMessageDialog(null, "No hay nodos ingresados");
        }
    }//GEN-LAST:event_MIEliminarNodoActionPerformed

    private void MIGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MIGuardarActionPerformed
        lienzo.crearXML(rutaArchivo);;
    }//GEN-LAST:event_MIGuardarActionPerformed

    private void MIGuardarComoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MIGuardarComoActionPerformed
        this.prepararSeleccionadorParaGuardar();
        int returnVal = selecArchivo.showSaveDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File archivoSeleccionado = selecArchivo.getSelectedFile();
            if (archivoSeleccionado.exists()) {// si existe pregutno antes de sobre escribirlo
                int sobreescribir = JOptionPane.showConfirmDialog(this, "Desea sobreescribir el fichero ?", "Atención", JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
                if (sobreescribir == JOptionPane.OK_OPTION) {
                    lienzo.crearXML(selecArchivo.getSelectedFile().getPath());
                    this.rutaArchivo = archivoSeleccionado.getPath();
Logs gestorLog;
     gestorLog= new Logs();
                    gestorLog.entrada(Logs.opciones.GuardarGrafo, Logs.ESCRITORIO);
                }
            } else {
                lienzo.crearXML(selecArchivo.getSelectedFile().getPath());
                this.rutaArchivo = archivoSeleccionado.getPath();
                Logs gestorLog;
     gestorLog= new Logs();
                gestorLog.entrada(Logs.opciones.GuardarGrafo, Logs.ESCRITORIO);
                
            }



        } else {
            File archivoSeleccionado = selecArchivo.getSelectedFile();

        }
    }//GEN-LAST:event_MIGuardarComoActionPerformed

    private void MIAbrirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MIAbrirActionPerformed
        this.preparSeleccionadorParaAbrir();
        int returnVal = selecArchivo.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File archivoSeleccionado = selecArchivo.getSelectedFile();
            lienzo.nuevoLienzo();
            lienzo.parsear(archivoSeleccionado.getPath());
            lienzo.setBounds(15, 15, 900, 515);
            lienzo.setBorder(javax.swing.BorderFactory.createRaisedBevelBorder());
            lienzo.setOpaque(true);
            panelFondoHoja.add(lienzo);
            rutaArchivo = archivoSeleccionado.getPath();
            Logs gestorLog;
     gestorLog= new Logs();
            gestorLog.entrada(Logs.opciones.AbrirGrafo, Logs.ESCRITORIO);
            btnWarshall.setEnabled(true);
            btnWarshall.setEnabled(true);
            jbtnCalcularAEM.setEnabled(true);
            jbtnCalcularSPF.setEnabled(true);
            jtxtNodoInicio.setEnabled(true);
            txtWarshallEntrada.setEnabled(true);
            txtWarshallFinal.setEnabled(true);
            this.MIGuardar.setEnabled(true);
            this.MIGuardarComo.setEnabled(true);
            this.MIGuardarImagen.setEnabled(true);
            


        }

    }//GEN-LAST:event_MIAbrirActionPerformed

    private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed
   
       WindowAdapter windowAdapter;
        windowAdapter = new WindowAdapter()
        {
            public void windowClosing(WindowEvent we)
            {
                
                setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
            }
        };
	
	
	}//GEN-LAST:event_formWindowClosed

    private void MIIniciarServidorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MIIniciarServidorActionPerformed

        Thread t = new Thread() {
            public void run() {

                servidor.iniciarServidor();

            }
        };
        t.start();
    }//GEN-LAST:event_MIIniciarServidorActionPerformed

    private void MIIniciarSecionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MIIniciarSecionActionPerformed
        VLogin l = new VLogin(this, true);
        l.setVisible(true);
        boolean log = Entidades.SingletonUsuario.getInstancia().isEstaLogueado();
        if (log) {
            this.MIIniciarSecion.setEnabled(false);
            this.MICrearUsuario.setEnabled(true);
            this.MINuevo.setEnabled(true);
            this.MIAbrir.setEnabled(true);
            this.MIGuardar.setEnabled(false);
            this.MIGuardarComo.setEnabled(false);
            this.MIGuardarImagen.setEnabled(false);
            this.MOpciones.setEnabled(true);
            this.MILogs.setEnabled(true);
            this.MICerrarSesion.setEnabled(true);
            this.setTitle(this.getTitle()
                    +" - "+Entidades.SingletonUsuario.getInstancia().getUsuario().getUsser());
            
        }
    }//GEN-LAST:event_MIIniciarSecionActionPerformed

    private void MICrearUsuarioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MICrearUsuarioActionPerformed
        VNuevoUsuario n = new VNuevoUsuario(this, true);
        n.setVisible(true); // TODO add your handling code here:
    }//GEN-LAST:event_MICrearUsuarioActionPerformed

    private void MIGuardarImagenActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MIGuardarImagenActionPerformed
        String nombre = JOptionPane.showInputDialog(null, "Nombre: ");
        File file = new File("./Saves/" + nombre + ".png");
        if (file.exists()) {
            if (JOptionPane.showConfirmDialog(null, "La imagen ya existe, desea remplazarla?", "ATENCION!", JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) {
                lienzo.imagenes(nombre);
                onEscribirConsola("Imagen guardada en: " + System.getProperty("user.dir") + "/Saves");
                Logs gestorLog;
     gestorLog= new Logs();
                gestorLog.entrada(Logs.opciones.GuardarImagen, Logs.ESCRITORIO);
            }
        } else {
            lienzo.imagenes(nombre);
            onEscribirConsola("Imagen guardada en: " + System.getProperty("user.dir") + "/Saves");
            Logs gestorLog;
     gestorLog= new Logs();
            gestorLog.entrada(Logs.opciones.GuardarImagen, Logs.ESCRITORIO);
        }


    }//GEN-LAST:event_MIGuardarImagenActionPerformed

    private void MILogsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MILogsActionPerformed
       VLogs L= new VLogs();
       L.setVisible(true);
        
    }//GEN-LAST:event_MILogsActionPerformed

    private void btnWarshallActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnWarshallActionPerformed
    try{
     int  nodoABuscar = Integer.parseInt(this.txtWarshallEntrada.getText());
     int  nodoABuscar2 = Integer.parseInt(this.txtWarshallFinal.getText()); 
     if(!lienzo.existeNodo(nodoABuscar)||!lienzo.existeNodo(nodoABuscar2) ){
         throw new NodoInexistente("El nodo ingrsado no existe");
     }
     lienzo.grafo.caminosXWarshall();
     if(lienzo.grafo.trans[nodoABuscar][nodoABuscar2]){
         JOptionPane.showMessageDialog(null, "Existe un camino entre el nodo "+nodoABuscar+
                 " y el nodo "+nodoABuscar2);
    
     }
     else{
         JOptionPane.showMessageDialog(null, " NO Existe un camino entre el nodo "+nodoABuscar+
                 " y el nodo "+nodoABuscar2);
     }
    }
    catch(NumberFormatException NFE){
        JOptionPane.showMessageDialog(null, " Solo numeros para los nodos");
    } 
    catch (NodoInexistente NI){
        JOptionPane.showMessageDialog(null, NI.getMessage());
    }
     
   
    }//GEN-LAST:event_btnWarshallActionPerformed

    private void MIlimpiarAccionesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MIlimpiarAccionesActionPerformed
        Logs l= new Logs();
        l.limpiarAcciones();// TODO add your handling code here:
        this.onEscribirConsola("> Se eliminó el historial");
    }//GEN-LAST:event_MIlimpiarAccionesActionPerformed

    private void jbtnCalcularAEMActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnCalcularAEMActionPerformed
        ArrayList<String> arcosAPintar = new ArrayList<String>(); 
        ArrayList <Integer> aem = lienzo.grafo.buscarAEM();
        for(int i=0;i<aem.size();i=i+2)
        {  
            arcosAPintar.add(""+aem.get(i)+""+aem.get(i+1));
        }
                    
        lienzo.pintarAEM=true;
        lienzo.arcosAPintar=arcosAPintar;
        lienzo.repaint();
    }//GEN-LAST:event_jbtnCalcularAEMActionPerformed

    private void jbtnCalcularSPFActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbtnCalcularSPFActionPerformed
       try{
        int  nodoABuscar = Integer.parseInt(this.jtxtNodoInicio.getText());
         if(!lienzo.existeNodo(nodoABuscar) ){
         throw new NodoInexistente("El nodo ingrsado no existe");
     }
         String aux="";
         aux=lienzo.grafo.buscarCMC(nodoABuscar);
         if(lienzo.listaArcos.isEmpty())aux="no hay nodos conectados";       
         VDijsktra ventana = new VDijsktra(aux);
         ventana.setVisible(true);
         
    }
    catch(NumberFormatException NFE){
        JOptionPane.showMessageDialog(null, " Solo numeros para los nodos");
    } 
    catch (NodoInexistente NI){
        JOptionPane.showMessageDialog(null, NI.getMessage());
    }
    }//GEN-LAST:event_jbtnCalcularSPFActionPerformed

    private void MICerrarSesionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MICerrarSesionActionPerformed
        ADO.Logs l = new ADO.Logs();
        l.entrada(Logs.opciones.CerrarSesion, 1);
        Entidades.SingletonUsuario.getInstancia().setEstaLogueado(false);
        Entidades.SingletonUsuario.getInstancia();
        panelFondoHoja.remove(lienzo);
        this.repaint();
        this.MIIniciarSecion.setEnabled(true);
        this.MICrearUsuario.setEnabled(false);
            this.MINuevo.setEnabled(false);
            this.MIAbrir.setEnabled(false);
            this.MIGuardar.setEnabled(false);
            this.MIGuardarComo.setEnabled(false);
            this.MIGuardarImagen.setEnabled(false);
            this.MOpciones.setEnabled(false);
            this.MILogs.setEnabled(false);
            this.MICerrarSesion.setEnabled(false);
            this.btnWarshall.setEnabled(false);
            this.jbtnCalcularAEM.setEnabled(false);
            this.jbtnCalcularSPF.setEnabled(false);
            this.txtWarshallEntrada.setEnabled(false);
            this.txtWarshallFinal.setEnabled(false);
            this.jtxtNodoInicio.setEnabled(false);
            this.MEdiar.setEnabled(false);
            this.setTitle("PGG");
            
            
        
    }//GEN-LAST:event_MICerrarSesionActionPerformed

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        if(Entidades.SingletonUsuario.getInstancia().isEstaLogueado())
        {
            ADO.Logs l = new ADO.Logs();
            l.entrada(Logs.opciones.CerrarSesion, 1);
        }
    }//GEN-LAST:event_formWindowClosing

    private void MINuevoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MINuevoActionPerformed
        lienzo.nuevoLienzo();
        lienzo.setBounds(15, 15, 900, 515);
        lienzo.setBorder(javax.swing.BorderFactory.createRaisedBevelBorder());
        lienzo.setOpaque(true);
        panelFondoHoja.add(lienzo);
       // lienzo.repaint();
        MIGuardarImagen.setEnabled(true);
        rutaArchivo = ".Saves/grafo1.xml";
        this.btnWarshall.setEnabled(true);
        this.jbtnCalcularAEM.setEnabled(true);
        this.jbtnCalcularSPF.setEnabled(true);
        this.jtxtNodoInicio.setEnabled(true);
        this.txtWarshallEntrada.setEnabled(true);
        this.txtWarshallFinal.setEnabled(true);
        this.MIGuardar.setEnabled(true);
        this.MIGuardarComo.setEnabled(true);
        this.MIGuardarImagen.setEnabled(true);
        this.MEdiar.setEnabled(true);
    }//GEN-LAST:event_MINuevoActionPerformed
    /**
     * @param args the command line arguments
     */
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenu MArchivo;
    private javax.swing.JMenu MArco;
    private javax.swing.JMenu MEdiar;
    private javax.swing.JMenuItem MIAbrir;
    private javax.swing.JMenuItem MICerrarSesion;
    private javax.swing.JMenuItem MICrearUsuario;
    private javax.swing.JMenuItem MIEliminarArco;
    private javax.swing.JMenuItem MIEliminarNodo;
    private javax.swing.JMenuItem MIGuardar;
    private javax.swing.JMenuItem MIGuardarComo;
    private javax.swing.JMenuItem MIGuardarImagen;
    private javax.swing.JMenuItem MIIniciarSecion;
    private javax.swing.JMenuItem MIIniciarServidor;
    private javax.swing.JMenuItem MILogs;
    private javax.swing.JMenuItem MINuevo;
    private javax.swing.JMenuItem MINuevoArco;
    private javax.swing.JMenuItem MINuevoNodo;
    private javax.swing.JMenuItem MIPonderarArco;
    private javax.swing.JMenuItem MIPonderarNodo;
    private javax.swing.JMenuItem MIlimpiarAcciones;
    private javax.swing.JMenu MNodo;
    private javax.swing.JMenu MOpciones;
    private javax.swing.JButton btnWarshall;
    private javax.swing.JTextArea consola;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JPopupMenu.Separator jSeparator2;
    private javax.swing.JSeparator jSeparator3;
    private javax.swing.JSeparator jSeparator4;
    private javax.swing.JButton jbtnCalcularAEM;
    private javax.swing.JButton jbtnCalcularSPF;
    private javax.swing.JTextField jtxtNodoInicio;
    private javax.swing.JPanel panelFondoHoja;
    private javax.swing.JPanel panelOpciones;
    private javax.swing.JTextField txtWarshallEntrada;
    private javax.swing.JTextField txtWarshallFinal;
    // End of variables declaration//GEN-END:variables

    /**
     * Metodo para simplificar el codigo
     */
    /*
     * Setea el file chooser con las caracs necesrias para abrir proyectos
     */
    public void preparSeleccionadorParaAbrir() {
        selecArchivo.setDialogTitle("Abrir");
        selecArchivo.setCurrentDirectory(new File("./Saves"));
        selecArchivo.setFileFilter(new filtroExtensionXML());
    }

    public void prepararSeleccionadorParaGuardar() {
        selecArchivo.setDialogTitle("Guardar");
        selecArchivo.setCurrentDirectory(new File("./Saves"));


    }

    public void internasionalizar() {
        /**
         * Al no pasarle un local como parametro, bsuca le por default
         */
        this.MArchivo.setText(ResourceBundle.getBundle("Bundle").getString("VPrincipal.MArchivo.text"));;

    }

    @Override
    public void onEscribirConsola(final String textoAEscribir) {
        Runnable r = new Runnable() {
            public void run() {

                consola.append("\n" + textoAEscribir);

            }
        };

        SwingUtilities.invokeLater(r);
    }
}
